package com.csw.scala

object Demo21match {
  def main(args: Array[String]): Unit = {

    /**
      * 模式匹配：
      *
      * java中的模式匹配可以匹配：基本数据类型，字符串，枚举
      *
      * scala中的模式匹配可以匹配，基本数据类型，字符串，枚举，对象，类型
      *
      */

    //匹配基本数据类型
    val i: Double = 100.1

    /**
      * 按照顺序执行case，只有一个可以匹配成功
      */

    i match {
      case 100 => println(100)
      case 100.1 => {
        //如果一行不够写，增加大括号后写多行
        println("csw")
      }
      case _ => println("默认的匹配结果")
    }


    /**
      * 匹配字符串
      */

    val x: String = "scala"

    x match {
      case "java" => println("java")
      case "scala" => println("scala")
    }

    /**
      * 匹配对象
      */
    case class User(id: String, name: String)

    val user: User = User("001", "csw")

    user match {
      case User("001", "zs") => println("zs")
      case User("001", csw) => println("csw")
      case _ => println("其它")
    }

    /**
      * 匹配类型
      *
      */

    //Any 相当于Object
    val a: Any = "csw"

    a match {
      //如果匹配成功  b相当于a的引用
      case b: Int => println(s"$b 是Int类型")
      case c: String => println(s"$c 是一个字符串")
      case u: User => println(s"$u 是一个User")
      case _ => println("其它")
    }

    val map = Map("001" -> "zs", "002" -> "ls")

    /**
      * Option是一个可选的值，只有两个取值，有值为Some， 无值为None
      */
    val option: Option[String] = map.get("001")
    //    println(v) //some(zs)

    /**
      * match 可以有返回值
      *
      */
    val v = option match {
      case Some(v) => v
      case None => "默认值"
    }
    println(v)

    //相当于
    println(map.getOrElse("001","默认值"))

  }
}
